package com.sky.testmodule.controller.redis;

import com.sky.testmodule.constant.TestConstant;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;

/**
 * @author zhiwei Liao
 * @version 1.0
 * @Description
 * @Date 2021/9/22 16:16
 */
@RequestMapping("/list")
@RestController
public class ListController {

    @Autowired
    RedisTemplate redisTemplate;


    @GetMapping("/listCache")
    public void listCache(){
        //从左边插入，即插入到列表头部
        redisTemplate.opsForList().leftPush(TestConstant.KEY_TEST, new Object());
        //从左边插入一个数组
        String[] books = new String[] {"liaozhiwei", "CSDN"};
        redisTemplate.opsForList().leftPushAll(TestConstant.KEY_TEST, books);
        //从左边插入一个集合
        List<String> list = new ArrayList<>();
        list.add("liaozhiwei01");
        list.add("liaozhiwei02");
        list.add("liaozhiwei03");
        redisTemplate.opsForList().leftPushAll(TestConstant.KEY_TEST, list);
        //如果存在key对应的列表，则从左插入，不存在不做操作
        redisTemplate.opsForList().leftPushIfPresent(TestConstant.KEY_TEST, new Object());
        //在key对应的列表中从左边开始找，找到第一个pivot，然后把value插到pivot左边，没有不做操作
        redisTemplate.opsForList().leftPush(TestConstant.KEY_TEST, new Object(), new Object());
        //也可以从右边插入，把上面的left改为right即可
        redisTemplate.opsForList().rightPush(TestConstant.KEY_TEST, new Object(), new Object());
        //指定位置重新设置指定值
        redisTemplate.opsForList().set(TestConstant.KEY_TEST, 1, new Object());
        //删除和value相同的count个元素，count < 0，从右开始,count > 0，从左开始,count = 0，全部
        redisTemplate.opsForList().remove(TestConstant.KEY_TEST, -1, new Object());
        //获取制定下标对应的值 index,从0开始，有正负两套下标
        //[a,b,c,d] 下标有[0,1,2,3]和[0,-3,-2,-1];
        redisTemplate.opsForList().index(TestConstant.KEY_TEST, 1);
        //查询list中指定范围的内容
        redisTemplate.opsForList().range(TestConstant.KEY_TEST, 0, -1);
        //修剪列表，使其只包含指定范围内的元素
        redisTemplate.opsForList().trim(TestConstant.KEY_TEST, 0, 2);
        //查询列表长度
        redisTemplate.opsForList().size(TestConstant.KEY_TEST);
        //弹出最左边元素
        redisTemplate.opsForList().leftPop(TestConstant.KEY_TEST);
        //移出并获取列表的第一个元素， 如果列表没有元素会阻塞列表直到等待超时。
        redisTemplate.opsForList().leftPop(TestConstant.KEY_TEST, 10, TimeUnit.SECONDS);
        //弹出最右边元素
        redisTemplate.opsForList().rightPop(TestConstant.KEY_TEST);
        //弹出k1最右边元素并放入k2最左边
        redisTemplate.opsForList().rightPopAndLeftPush(TestConstant.KEY_TEST, new Object());
    }

}
